### Алгоритмы II
С помощью стандартных алгоритмов (см. ```<algorithm>```) и функторов (см. ```<functional>```) реализуйте
следующую программу:
1. Считайте в стандартный контейнер геометрические фигуры из файла, имя которого будет переданно
в программу через параметры командной строки. Этот пункт должен быть выполнен отдельным
действием, нельзя совмещать дальнейшие действия с чтением данных

• Геометрические фигуры должны быть заданы следующей структурой:
```cpp
struct Point
{
  int x, y;
};

struct Polygon
{
  std::vector< Point > points;
};
```
• В файле с описаниями фигур на каждой строке содержится не более одного описания фигуры, содержащего по порядку: количество вершин в фигуре, последовательность из указанного
количества вершин. Каждая вершина задаётся парой координат. Например, файл с описанием
может иметь вид:
```txt
3 (1;1) (1;3) (3;3)
4 (0;0) (0;1) (1;1) (1;0)
5 (0;0) (0;1) (1;2) (2;1) (2;0)
3 (0;0) (-2;0) (0;-2)
```
Элементы описания разделены друг от друга ровно одним пробелом.
• Не соответствующие формату описания фигур должны игнорироваться

• Если описание фигуры соответствует формату, то гарантируется: отсуствие самопересечений и
что любая тройка вершин фигуры формирует невырожденный треугольник

3. Программа должна обрабатывать пользовательский ввод и поддерживать ряд команд. Веществен-
ные числа в результатах выводятся с точностью до одного знака после запятой. Далее приведено
описание команд с примерами, в которых подразумевается, что были считаны фигуры, описанные
выше:

• [AREA <EVEN|ODD>] Расчёт суммы площади фигур с нечётным количеством вершин и с чётным
(в зависимости от переданного параметра)
```txt
AREA ODD
1.0
AREA EVEN
7.0
```

• [AREA <MEAN>] Расчёт среднего площадей фигур
```txt
AREA MEAN
2.0
```
Для расчёта среднего требуется по крайней мере одна фигура

• [AREA <num-of-vertexes>] Расчёт суммы площади фигур с заданным количеством вершин
```txt
AREA 3
4.0
```

• [MAX <AREA|VERTEXES>] Расчёт максимального значения площади или количества вершин (в
зависимости от переданного параметра)
```txt
MAX AREA
3.0
MAX VERTEXES
5
```
Для расчёта максимума требуется по крайней мере одна фигура

• [MIN <AREA|VERTEXES>] Расчёт минимального значения площади или количества вершин (в
зависимости от переданного параметра)
```txt
MIN AREA
1.0
MIN VERTEXES
3
```
Для расчёта минимума требуется по крайней мере одна фигура

• [COUNT <EVEN|ODD|num-of-Vertexes>] Подсчёт количества фигур с нечётным, чётным и конкретным количеством вершин (в зависимости от переданного параметра)
```txt
COUNT EVEN
3
COUNT ODD
1
COUNT 3
2
```
5. Кроме того, поддержите реализацию ещё нескольких команд, указанных преподавателем (не менее
2-х из перечисленных):

• PERMS <Polygon> Подсчёт количества фигур, которые являются перестановкой координат ука-
занной в качестве параметра. Например, для фигур
```txt
3 (3;3) (1;1) (1;3)
3 (0;1) (1;1) (0;0)
3 (3;1) (1;1) (3;3)
```
Ожидается следующий результат:
```txt
PERMS 3 (1;1) (1;3) (3;3)
2
```

• MAXSEQ <Polygon> Подсчёт максимального количества идущих подряд фигур идентичной указанной в параметрах. Например, для фигур
```txt
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
```
Ожидается следующий результат:
```txt
MAXSEQ 3 (3;3) (1;1) (1;3)
3
MAXSEQ 4 (0;0) (1;0) (1;1) (0;1)
2
MAXSEQ 4 (1;0) (1;1) (0;1) (0;0)
0
```

• RMECHO <Polygon> Удаление идущих подряд дубликатов фигур идентичных указанной в параметре и вывод количества удалённых фигур. Например, для фигур
```txt
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
```
Ожидается следующий результат:
```txt
RMECHO 3 (3;3) (1;1) (1;3)
2
```
При этом, оставшиеся фигуры идентичны следующему набору
```txt
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
```

• ECHO <Polygon> Дублирует всякое вхождение указанной в параметре фигуры. Дубликаты
добавляются сразу после идентичного элемента. Команда должна выводить количество добавленных
фигур. Например, для фигур
```txt
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
```
Ожидается следующий результат:
```txt
ECHO 3 (3;3) (1;1) (1;3)
2
```
При этом, фигуры в коллекции идентичны следующему набору:
```txt
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
3 (3;3) (1;1) (1;3)
```

• LESSAREA <Polygon> Команда подсчитывает количество фигур с площадью меньшей, чем
площадь фигуры, переданной в параметре. Например, для фигур
```txt
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
3 (3;3) (1;1) (1;3)
4 (0;0) (1;0) (1;1) (0;1)
```
Ожидается следующий результат:
```txt
LESSAREA 3 (0;0) (2;2) (2;0)
2
```

• INFRAME <Polygon> Команда проверяет лежит ли указанная фигура целиком внутри прямо-
угольника, ограничивающего сохранённый в коллекции набор фигур: если да - выводится со-
общение <TRUE>, иначе - <FALSE>. Например, для фигур
```txt
4 (0;0) (1;0) (1;1) (0;1)
4 (5;5) (6;5) (6;6) (5;6)
```
Ожидается следующий результат:
```txt
INFRAME 3 (0;0) (2;2) (2;0)
<TRUE>
INFRAME 3 (-1;-1) (1;1) (1;0)
<FALSE>
```

• INTERSECTIONS <Polygon> Команда подсчитывает количество фигур, с которыми пересекается
фигура, указанная в параметрах. Например, для фигур
```txt
4 (0;0) (1;0) (1;1) (0;1)
4 (1;1) (2;1) (2;2) (1;2)
```
Ожидается следующий результат:
```txt
INTERSECTIONS 4 (0;0) (2;0) (2;2) (0;2)
2
INTERSECTIONS 4 (1;1) (3;1) (3;3) (1;3)
2
INTERSECTIONS 4 (2;2) (4;2) (4;4) (2;4)
1
```

• SAME <Polygon> Команда подсчитывает количество фигур, совместимых наложением (без 
поворотов) с указанной в параметрах. Например, для фигур
```txt
4 (0;0) (1;0) (1;1) (0;1)
3 (0;0) (1;1) (0;1)
4 (1;1) (2;1) (2;2) (1;2)
```
Ожидается следующий результат:
```txt
SAME 4 (-1;-1) (-1;0) (0;0) (0;-1)
2
SAME 3 (10;10) (11;11) (10;11)
1
SAME 3 (10;10) (10;11) (11;10)
0
```

• RECTS Команда подсчитывает количество прямоугольников в коллекции фигур. Например, для
фигур
```txt
4 (0;0) (1;0) (1;1) (0;1)
3 (0;0) (1;1) (0;1)
4 (1;1) (0;2) (1;3) (2;2)
4 (-2;1) (2;3) (3;1) (-1;-1)
```
Ожидается следующий результат:
```txt
RECTS
3
```

• RIGHTSHAPES Команда подсчитывает количество фигур, содержащих прямые углы. Например,
для фигур
```txt
4 (0;0) (1;0) (1;1) (0;1)
5 (-1;-1) (-2;1) (3;0) (3;-5) (0;-6)
3 (0;0) (1;1) (0;1)
4 (1;1) (0;2) (1;3) (2;2)
```
Ожидается следующий результат:
```txt
RIGHTSHAPES
3
```

7. Если команда по каким-то причинам некорректна, то должно быть выведено сообщение ```<INVALID COMMAND>```
8. Признаком конца ввода команд является EOF (на Linux: Ctrl + D | на Windows Ctrl +Z затем
Enter)
9. Работа должа быть выполнена в виде 1-го исполняемого файла, принимающего параметры следую-
щим образом
```bash
$ ./lab filename
```
```filename``` представляет собой обязательный параметр. Если он не задан, программа должна завершаться с ненулевым кодом возврата и сообщением об ошибке

Совет-1 Не используйте алгоритм ```std::for_each``` и циклы. Постарайтесь подобрать более специальный алгоритм

Совет-2 Постарайтесь использовать именно стандартные функторы и композиции из них (см. ```std::bind```)
Подумайте, какие типы можно реализовать дополнительно и какие операторы для них можно было
бы перегрузить
